import {IllegalArgumentException, IllegalStateException} from "./exception.js";
import Layers from "./layers/index.js";

class Asserts {
    /**
     * 当 expression 为 false 时抛出异常。
     *
     * @param obj {any} 要检测的对象
     * @param message {string} 报错信息
     */
    static state = (obj, message) => {
        if (!obj) {
            throw new IllegalStateException(message);
        }
    }

    /**
     * 当 expression 为 false 时抛出异常。
     *
     * @param obj {any} 要检测的对象
     * @param message {string} 报错信息
     */
    static isTrue = (obj, message) => {
        if (!obj) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 判断对象是不是为空
     *
     * @param obj {any} 要检测的对象
     * @param message {string} 报错信息
     */
    static notBlank = (obj, message) => {
        if (Layers.isBlank(obj)) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 判断对象是不是为空
     *
     * @param obj {any} 要检测的对象
     * @param message {string} 报错信息
     */
    static notEmpty = (obj, message) => {
        if (Layers.isEmpty(obj)) {
            throw new IllegalArgumentException(message);
        }
    }


    /**
     * 判断对象是不是指定类型
     *
     * @param type {'number'|'string'|'symbol'|'bigint'|'boolean'|'function'|'object'|'undefined'|'null'} 类型
     * @param obj {any} 要检测的对象
     * @param message {string} 报错信息
     */
    static isTypeOf = (type, obj, message) => {
        if (typeof obj === type) {
            throw new IllegalArgumentException(message);
        }
    }

    /**
     * 判断一个对象是不是处在另一个对象原型链上
     *
     * @param type {any} 父类
     * @param obj {any} 要检测的对象
     * @param message {string} 报错信息
     */
    static isPrototypeOf = (type, obj, message) => {
        if (type.prototype.isPrototypeOf(obj)) {
            throw new IllegalArgumentException(message);
        }
    }
}

export default Asserts;

